package com.hengpeng.itfin.service.account;

import java.util.List;

import com.hengpeng.itfinbase.en.TradeMode;
import com.hengpeng.itfinbase.en.TransType;
import com.hengpeng.itfinbase.persist.Account;

/**
 * <pre>
 * 资金账户,资金日志服务类
 * </pre>
 * 
 * @author weiyuan
 * @version 1.0, 2015年5月30日
 */
public interface AccountService {
    /**
     * <pre>
     * 锁定指定用户的账户信息
     * </pre>
     * 
     * @param userId
     * @param isLock
     * @return
     */
    public Account lockAccount(Long userId);

    /**
     * <pre>
     * 用户资金账户交易变动：加钱,减钱,冻结,解冻
     * </pre>
     * 
     * @param userId
     *            用户id
     * @param totalMoney
     *            交易总金额
     * @param baseMoney
     *            交易金额中本金金额
     * @param interestMoney
     *            交易金额中利息金额
     * @param transType
     *            交易业务类型
     * @param tradeMode
     *            交易模式
     * @param referenceId
     *            关联业务id
     * @param remark
     *            备注
     */
    public void changeAccountMoney(Long userId, Long totalMoney, Long baseMoney, Long interestMoney,
            TransType transType, TradeMode tradeMode, String referenceId, String remark);

    /**
     * <pre>
     * 用户资金账户交易变动：加钱,减钱,冻结,解冻
     * </pre>
     * 
     * @param userId
     *            用户id
     * @param money
     *            交易金额
     * @param transType
     *            交易业务类型
     * @param tradeMode
     *            交易模式
     * @param referenceId
     *            关联业务id
     * @param remark
     *            备注
     */
    public void changeAccountMoney(Long userId, Long money, TransType transType, TradeMode tradeMode,
            String referenceId, String remark);

    /**
     * <pre>
     * 放款操作资金账户
     * </pre>
     * 
     * @param userId
     * @param totalMoney
     * @param baseMoney
     * @param interestMoney
     * @param transType
     * @param tradeMode
     * @param referenceId
     * @param remark
     * @param addTotal
     */
    public void loansChangeAccountMoney(Long userId, Long totalMoney, Long baseMoney, Long interestMoney,
            TransType transType, TradeMode tradeMode, String referenceId, String remark, boolean addTotal);

    /**
     * 冻结资金
     * 
     * @param userId
     * @param transType
     * @param money
     * @param referenceId
     * @param remark
     */
    public void freeze(Long userId, TransType transType, Long money, String referenceId, String remark);

    /**
     * 事件完成，解冻并扣款
     * 
     * @param userId
     * @param transType
     * @param money
     */
    public void unfreezeForSuc(Long userId, TransType transType, Long money, String referenceId, String remark);

    /**
     * 事件失败解冻资金
     */
    public void unfreezeForFail(Long userId, TransType transType, Long money, String referenceId, String remark);

    /**
     * 加钱操作
     * 
     * @param userId
     * @param transType
     * @param money
     * @param referenceId
     * @param remark
     */
    public void add(Long userId, TransType transType, Long money, String referenceId, String remark);

    /**
     * 直接扣款（不冻结）
     * 
     * @param userId
     * @param transType
     * @param money
     * @param referenceId
     * @param remark
     */
    public void subtractNoFreeze(Long userId, TransType transType, Long money, String referenceId, String remark);

    /**
     * <pre>
     * 资金账户查询
     * </pre>
     * 
     * @param userId
     * @return
     */
    public Account getAccount(Long userId);

    /**
     * <pre>
     * 查询平台账户
     * </pre>
     * 
     * @return
     */
    public List<Account> queryPlatFormList();
}
